package com.guli.eduService.Listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.guli.eduService.entity.EduSubject;
import com.guli.eduService.entity.vo.ExcelSubjectData;
import com.guli.eduService.service.impl.EduSubjectServiceImpl;
import com.guli.serviceBase.Entity.GuliExcepiton;

import java.util.Map;

/**
 * @author zxc
 * @date 2023/04/02 15:07
 **/
// 为了读取excel文件中数据，所定义的监听器
public class SubjectListener extends AnalysisEventListener<ExcelSubjectData> {
    // 手动注入eduSubjectService，保证能够去调用Mybatis-Plus中所定义的SQL语句;
    private EduSubjectServiceImpl eduSubjectService;
    public SubjectListener(){}
    // 创建有参数构造，传递subjectService用于操作数据库
    public SubjectListener(EduSubjectServiceImpl eduSubjectService){
        this.eduSubjectService = eduSubjectService;
    }

    // 逐行去读取所传入的excel文件中内容;
    @Override
    public void invoke(ExcelSubjectData data, AnalysisContext analysisContext) {
        // 即，所传入的excel文件中不存在数据
        if(data == null){
            throw new GuliExcepiton(20001,"添加失败！！！");
        }
        // 后续 ：即，需要将excel中课程分类信息加入到数据库中
        // 需要去判断数据库中是否存在该条课程信息;
        // 1.判断当前数据行的一级课程信息，是否存在于数据库中;
        EduSubject oneSubject = isExistOneData(data.getOneSubject());
        // 一级课程信息不存在于数据库中的情况 ：
        if(oneSubject == null){
            // 添加该一级课程信息到数据库中
            oneSubject = new EduSubject();
            oneSubject.setParentId("0");
            oneSubject.setTitle(data.getOneSubject());
            System.out.println("正在向数据库中添加 ： " + oneSubject);
            eduSubjectService.save(oneSubject);
        }

        // 2.判断当前数据行的二级课程信息，是否存在于数据库中;
        String pid = oneSubject.getId(); // 获取当前记录中一级课程对应的id，其应该为二级课程的parent_id
        EduSubject twoSubject = isExistTwoData(data.getTwoSubject() , pid);
        // 二级课程信息不存在于数据库中的情况 ：
        if(twoSubject == null){
            // 添加该二级课程信息到数据库中
            twoSubject = new EduSubject();
            twoSubject.setParentId(pid);
            twoSubject.setTitle(data.getTwoSubject());
            System.out.println("正在向数据库中添加 ： " + twoSubject);
            eduSubjectService.save(twoSubject);
        }
    }


    // 即，判断该二级课程信息，是否存在于数据库中;
    // 传入参数 ：二级课程名称 && 其所对应的一级课程的id
    private EduSubject isExistTwoData(String twoSubject, String pid) {
        // 创建QueryWrapper对象，来封装查询条件;
        QueryWrapper<EduSubject> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("title" , twoSubject);
        queryWrapper.eq("parent_id" , pid);
        return eduSubjectService.getOne(queryWrapper);
    }

    // 即，判断该一级课程信息，是否存在于数据库中;
    // 传入参数 ：一级课程名称
    private EduSubject isExistOneData(String oneSubject) {
        // 创建QueryWrapper对象，来封装查询条件;
        QueryWrapper<EduSubject> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("title" , oneSubject);
        queryWrapper.eq("parent_id" , "0");
        return eduSubjectService.getOne(queryWrapper);
    }

    // 读取excel文件中表头数据
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        System.out.println("表头数据 ：" + headMap);
    }

    // 读取完excel文件中所有数据后，执行该方法;
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}
